{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 实验项目名称：神经网络算法的变成和实现"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "run_control": {
     "marked": true
    }
   },
   "source": [
    "实验内容：基于神经网络回归算法实现指定数据集的回归分析 \n",
    "实验要求：\n",
    "读取训练nnregtrain.csv 和测试 nnregtest.csv文件 \n",
    "生成X_train,y_train,X_test,y_test \n",
    "利用MLPRegressor训练神经网络模型 \n",
    "回归ytest和ypred关系曲线，绘制训练过程损失函数变化曲线 \n",
    "计算模型的均方误差和r2-score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neural_network import MLPRegressor\n",
    "from sklearn.metrics import r2_score, mean_squared_error"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 读取文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = pd.read_csv(\"./data/nn_reg_train.csv\", header=None)\n",
    "test = pd.read_csv(\"./data/nn_reg_test.csv\", header=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 生成训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "train1 = train.values\n",
    "test1 = test.values\n",
    "\n",
    "X_train = train1[:, :2]\n",
    "y_train = train1[:, 2]\n",
    "X_test = test1[:, :2]\n",
    "y_test = test1[:, 2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练神经网络模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MLPRegressor(activation='logistic', hidden_layer_sizes=(64,),\n",
       "             learning_rate_init=0.1, solver='sgd')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mlp_cls = MLPRegressor(hidden_layer_sizes=(64,), activation=\"logistic\",\n",
    "                       solver=\"sgd\", alpha=1e-4, learning_rate_init=0.1, tol=1e-4)\n",
    "mlp_cls.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 生成预测值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = mlp_cls.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据可视化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ytest和ypred关系曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'y值')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams[\"font.family\"] = \"SimHei\"\n",
    "plt.plot(np.linspace(0,200,100),y_test,\".-r\", lw=1.5, mec=\"k\", ms=8)\n",
    "plt.plot(np.linspace(0,200,100),y_pred,\".-g\", lw=1.5, mec=\"k\", ms=8)\n",
    "plt.legend([\"训练集\", \"测试集\"], loc=0, numpoints=3, fontsize=12)\n",
    "plt.xlabel(\"样本个数\", fontsize=12)\n",
    "plt.ylabel(\"y值\", fontsize=12)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 均方误差和r2-score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "r2 score：0.9028311934068044\n",
      "均方误差：0.2168797438284976\n"
     ]
    }
   ],
   "source": [
    "print(f\"r2 score：{r2_score(y_test, y_pred)}\")\n",
    "print(f\"均方误差：{mean_squared_error(y_test, y_pred)}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
